﻿using System;
using System.Collections.Generic;
using System.Data;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    /// <summary>
    /// clase que maneja las operaciones sobre la base de datos de la entidad aseguradora
    /// </summary>
    public class DAOAseguradoraMySql:ConexionBaseDatos,IDAOAseguradora
    {
        #region Metodos

        /// <summary>
        /// metodo que agrega una aseguradora en la base de datos
        /// </summary>
        /// <param name="miAseguradora">datos de la aseguradora que se van a almacenar</param>
        /// <returns>id de la aseguradora almacenada</returns>
        public int AgregarAseguradora(Aseguradora miAseguradora)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "AgregarAseguradora";


                comando.Parameters.AddWithValue("@nombre", miAseguradora.Nombre);
                comando.Parameters.AddWithValue("@rif", miAseguradora.Rif);
                comando.Parameters.AddWithValue("@letraRif", miAseguradora.LetraRif);
                comando.Parameters.AddWithValue("@telefono", miAseguradora.Telefono);

                comando.Parameters["@nombre"].Direction = ParameterDirection.Input;
                comando.Parameters["@rif"].Direction = ParameterDirection.Input;
                comando.Parameters["@letraRif"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefono"].Direction = ParameterDirection.Input;

                int id = 0;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                CerrarConexion();
                return id;
            }
            catch (Exception)
            {

                return -1;
            }
        }

        /// <summary>
        /// obtiene todos los datos de una aseguradora dado su id
        /// </summary>
        /// <param name="idAseguradora">id de la aseguradora a buscar</param>
        /// <returns> todos los datos de la aseguradora en cuestion</returns>
        public Aseguradora ObtenerAseguradoraId(int idAseguradora)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Aseguradora miAseguradora = FabricaEntidades.ObtenerAseguradora();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "BuscarAseguradoraId";
                comando.Parameters.AddWithValue("@idAseguradora", idAseguradora);
                comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    miAseguradora.LetraRif = reader.GetChar(2);
                    miAseguradora.Rif = (long)reader[1];
                    miAseguradora.Nombre = (string)reader[3];
                    miAseguradora.Telefono = (string)reader[4];
                    miAseguradora.Id = (int)reader[0];
                }

                reader.Close();
                CerrarConexion();
                return miAseguradora;

            }
            catch (Exception)
            {

                return null;
            }
        }

        public bool EditarAseguradora(Aseguradora miAseguradora)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "EditarAseguradora";


                comando.Parameters.AddWithValue("@nombreNuevo", miAseguradora.Nombre);
                comando.Parameters.AddWithValue("@rifNuevo", miAseguradora.Rif);
                comando.Parameters.AddWithValue("@letraRifNuevo", miAseguradora.LetraRif);
                comando.Parameters.AddWithValue("@telefonoNuevo", miAseguradora.Telefono);
                comando.Parameters.AddWithValue("@idAseguradora", miAseguradora.Id);

                comando.Parameters["@nombreNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@rifNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@letraRifNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@telefonoNuevo"].Direction = ParameterDirection.Input;
                comando.Parameters["@idAseguradora"].Direction = ParameterDirection.Input;

                comando.ExecuteNonQuery();
                return true;

            }
            catch (Exception)
            {

                return false;
            }
        }

        /// <summary>
        /// obtiene la lista de todos las Aseguradoras que se encuentran registradas en 
        /// la base de datos
        /// </summary>
        /// <returns></returns>
        public List<Aseguradora> ObtenerAseguradoras()
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Aseguradora> retorno = new List<Aseguradora>(); 

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerAseguradoras";
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Aseguradora miAseguradora = FabricaEntidades.ObtenerAseguradora();
                    miAseguradora.LetraRif = reader.GetChar(2);
                    miAseguradora.Rif = (int)reader[1];
                    miAseguradora.Nombre = (string)reader[3];
                    miAseguradora.Telefono = (string)reader[4];
                    miAseguradora.Id = (int) reader[0] ;
                    retorno.Add(miAseguradora);
                }

                reader.Close();
                CerrarConexion();
                return retorno;

            }
            catch (Exception)
            {

                return null;
            }
        }
        /// <summary>
        /// Obtiene todas las aseguradoras que posean el mismo rif
        /// </summary>
        /// <param name="miAseguradora"></param>
        /// <returns></returns>
        public List<Aseguradora> ObtenerAseguradoraRif(Aseguradora miAseguradora)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Aseguradora> retorno = new List<Aseguradora>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerAseguradoraRif";

                comando.Parameters.AddWithValue("@letrarif", miAseguradora.LetraRif);
                comando.Parameters.AddWithValue("@rifB", miAseguradora.Rif);

                comando.Parameters["@letrarif"].Direction = ParameterDirection.Input;
                comando.Parameters["@rifB"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Aseguradora aseguradora = FabricaEntidades.ObtenerAseguradora();
                    aseguradora.LetraRif = reader.GetChar(2);
                    aseguradora.Rif = (int)reader[1];
                    aseguradora.Nombre = (string)reader[3];
                    aseguradora.Telefono = (string)reader[4];
                    aseguradora.Id = (int)reader[0];
                    retorno.Add(aseguradora);
                }

                reader.Close();
                CerrarConexion();
                return retorno;

            }
            catch (Exception)
            {

                return null;
            }
        }
        /// <summary>
        /// Obtiene todas las aseguradora que 
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<Aseguradora> ObtenerAseguradorasNombre(string nombre)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Aseguradora> retorno = new List<Aseguradora>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerAseguradoraNombre";

                comando.Parameters.AddWithValue("@nombreA", nombre);

                comando.Parameters["@nombreA"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Aseguradora aseguradora = FabricaEntidades.ObtenerAseguradora();
                    aseguradora.LetraRif = reader.GetChar(2);
                    aseguradora.Rif = (int)reader[1];
                    aseguradora.Nombre = (string)reader[3];
                    aseguradora.Telefono = (string)reader[4];
                    aseguradora.Id = (int)reader[0];
                    retorno.Add(aseguradora);
                }

                reader.Close();
                CerrarConexion();
                return retorno;

            }
            catch (Exception)
            {

                return null;
            }
        }

        public List<Aseguradora> ObtenerAseguradoraRifNumero(int numero)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                List<Aseguradora> retorno = new List<Aseguradora>();

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerAseguradoraRifNumero";

                comando.Parameters.AddWithValue("@rifN", numero);

                comando.Parameters["@rifN"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Aseguradora aseguradora = FabricaEntidades.ObtenerAseguradora();
                    aseguradora.LetraRif = reader.GetChar(2);
                    aseguradora.Rif = (int)reader[1];
                    aseguradora.Nombre = (string)reader[3];
                    aseguradora.Telefono = (string)reader[4];
                    aseguradora.Id = (int)reader[0];
                    retorno.Add(aseguradora);
                }

                reader.Close();
                CerrarConexion();
                return retorno;

            }
            catch (Exception)
            {

                return null;
            }
        }

        public List<Aseguradora> ObtenerAseguradoraLugarNombre(Lugar miLugar)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
